<?php

namespace app\admin\controller;

use app\common\BaseAdminController;
use think\facade\Db;

class Role extends BaseAdminController
{
    // 查询所有角色
    public function list($pageNum = 1, $pageSize = 10, $name = null)
    {
        // 使用模型查询
        $query = \app\model\Role::with('permissions')
            ->order('id', 'desc')
            ->page($pageNum, $pageSize);

        // 如果传入了 name 参数，则添加 where 条件
        if ($name) {
            $query->where('name', $name);
        }

        // 获取查询结果
        $list = $query->select();
        // 获取总记录数
        $total = $query->count();

        // 返回包含查询结果和总记录数的 JSON 数据
        return json(['code' => 200, 'msg' => '查询成功', 'data' => ['list' => $list, 'total' => $total]]);
    }

    // 添加角色
    public function add()
    {
        // 接收前端通过 POST 方法提交的数据
        $data = $this->request->post();
        // 实例化角色验证器对象，用于对接收的数据进行校验
        $validate = new \app\validate\Role();
        // 调用验证器的 check 方法对数据进行校验，若校验不通过
        if (!$validate->check($data)) {
            // 返回包含错误信息的 JSON 数据，状态码为 400
            return json(['code' => 400, 'msg' => $validate->getError()]);
        }
        // 查询数据库中是否存在该角色
        $result = Db::table('role')->where('name', $data['name'])->find();
        // 判断查询结果是否为空
        if (!empty($result)) {
            // 若查询结果不为空，返回包含错误信息的 JSON 数据，状态码为 400
            return json(['code' => 400, 'msg' => '该角色已存在']);
        }
        // 将经过校验的数据插入到 'role' 数据库表中，并获取插入操作的结果
        $result = Db::table('role')->insert($data);
        // 判断插入操作是否成功
        if ($result) {
            // 若插入成功，返回包含成功信息的 JSON 数据，状态码为 200
            return json(['code' => 200, 'msg' => '添加成功']);
        }
        // 若插入失败，返回包含错误信息的 JSON 数据，状态码为 400
        return json(['code' => 400, 'msg' => '添加失败']);
    }

    // 修改角色
    public function edit()
    {
        // 接收前端通过 POST 方法提交的数据
        $data = $this->request->post();
        // 实例化角色验证器对象，用于对接收的数据进行校验
        $validate = new \app\validate\Role();
        // 调用验证器的 check 方法对数据进行校验，若校验不通过
        if (!$validate->check($data)) {
            // 返回包含错误信息的 JSON 数据，状态码为 400
            return json(['code' => 400, 'msg' => $validate->getError()]);
        }

        // 查询数据库中是否存在该角色
        $result = Db::table('role')->where('id', $data['id'])->find();
        // 判断查询结果是否为空
        if (empty($result)) {
            // 若查询结果为空，返回包含错误信息的 JSON 数据，状态码为 400
            return json(['code' => 400, 'msg' => '该角色不存在']);
        }

        // 将经过校验的数据更新到 'role' 数据库表中，并获取更新操作的结果
        $result = Db::table('role')->update($data);
        // 判断更新操作是否成功
        if ($result) {
            // 若更新成功，返回包含成功信息的 JSON 数据，状态码为 200
            return json(['code' => 200, 'msg' => '修改成功']);
        }

        // 若更新失败，返回包含错误信息的 JSON 数据，状态码为 400
        return json(['code' => 400, 'msg' => '修改失败']);
    }

    // 关联角色和多个权限
    public function attachPermissions()
    {
        $rid = $this->request->post('rid');
        $pids = $this->request->post('pids'); // 格式为"1,2,3"
    
        // 使用模型验证角色是否存在
        $role = \app\model\Role::find($rid);
        if (!$role) {
            return json(['code' => 400, 'msg' => '角色不存在']);
        }
    
        $pidArr = explode(',', $pids);
        if (empty($pidArr)) {
            return json(['code' => 400, 'msg' => '权限ID不能为空']);
        }
    
        // 使用模型验证所有权限是否存在
        $permissionCount = \app\model\Permission::where('id', 'in', $pidArr)->count();
        if ($permissionCount != count($pidArr)) {
            return json(['code' => 400, 'msg' => '部分权限不存在']);
        }
    
        // 开启事务处理
        Db::startTrans();
        try {
            // 先移除角色的所有旧权限
            $role->permissions()->detach();
            
            // 然后绑定新权限
            $role->permissions()->attach($pidArr);
            
            Db::commit();
            return json(['code' => 200, 'msg' => '权限更新成功']);
        } catch (\Exception $e) {
            Db::rollback();
            return json(['code' => 400, 'msg' => '权限更新失败: '.$e->getMessage()]);
        }
    }

    // 取消角色和权限关联
    public function detachPermission()
    {
        $rid = $this->request->post('rid');
        $pid = $this->request->post('pid');

        // 验证角色是否存在
        $role = Db::table('role')->where('id', $rid)->find();
        if (empty($role)) {
            return json(['code' => 400, 'msg' => '角色不存在']);
        }

        // 验证权限是否存在
        $permission = Db::table('permission')->where('id', $pid)->find();
        if (empty($permission)) {
            return json(['code' => 400, 'msg' => '权限不存在']);
        }

        // 检查关联是否存在
        $exists = Db::table('role_permission')
            ->where('role_id', $rid)
            ->where('permission_id', $pid)
            ->find();

        if (empty($exists)) {
            return json(['code' => 400, 'msg' => '该角色未拥有此权限']);
        }

        // 删除关联
        $result = Db::table('role_permission')
            ->where('role_id', $rid)
            ->where('permission_id', $pid)
            ->delete();

        if ($result) {
            return json(['code' => 200, 'msg' => '取消关联成功']);
        }

        return json(['code' => 400, 'msg' => '取消关联失败']);
    }
}
